package com.lesama.mabstract;

/*
* 抽象类的特点：
* 1.抽象类不能实例化
* 2.抽象类存在构造函数：作用--给子类实例化调用
* 3.抽象类中可以存在普通方法：作用--给子类继承调用
* 4.抽象类的子类：a)要么重写父类的抽象方法， b)要么子类本身也是抽象类
* */

/*
* 与abstract冲突的关键字：
* 1.final: final要求方法不能被重写，与abstract要求方法必须重写冲突
* 2.private: private私有要求方法不能被重写（访问权限不足）
* 3.static: static修饰的方法可以通过类名.出来，但是abstract修饰的方法调用没有意义
* */
public class AbstractDemo2 {
    public static void main(String[] args) {
        // Father father = new Father(); // error
        Child child = new Child();
        child.print();
    }
}

abstract class A {
    public abstract void methodA();
}

abstract class B extends A {

    @Override
    public void methodA() {

    }
    public abstract void methodB();
}

class C extends B {

    @Override
    public void methodB() {

    }
}

abstract class Father {
    public abstract void print();
    public void method() {
        System.out.println("method...");
    }
}

class Child extends Father {
    public Child() {
        super();
    }

    @Override
    public void print() {
        System.out.println("子类重写的抽象方法");
    }

}